home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 53 / PC Actual CD 53.iso / Share / Progra / python / BeOpen-Python-2.0.exe / PYCOLORCHOOSER.PY < prev    next >
Encoding:
Python Source  |  2000-09-28  |  3.8 KB  |  123 lines

  1. """Color chooser implementing (almost) the tkColorColor interface
  2. """
  3.  
  4. import os
  5. import Main
  6. import ColorDB
  7.  
  8. class Chooser:
  9.     """Ask for a color"""
  10.     def __init__(self,
  11.                  master = None,
  12.                  databasefile = None,
  13.                  initfile = None,
  14.                  ignore = None,
  15.                  wantspec = None):
  16.         self.__master = master
  17.         self.__databasefile = databasefile
  18.         self.__initfile = initfile or os.path.expanduser('~/.pynche')
  19.         self.__ignore = ignore
  20.         self.__pw = None
  21.         self.__wantspec = wantspec
  22.  
  23.     def show(self, color, options):
  24.         # scan for options that can override the ctor options
  25.         self.__wantspec = options.get('wantspec', self.__wantspec)
  26.         dbfile = options.get('databasefile', self.__databasefile)
  27.         # load the database file
  28.         colordb = None
  29.         if dbfile <> self.__databasefile:
  30.             colordb = ColorDB.get_colordb(dbfile)
  31.         if not self.__master:
  32.             from Tkinter import Tk
  33.             self.__master = Tk()
  34.         if not self.__pw:
  35.             self.__pw, self.__sb = \
  36.                        Main.build(master = self.__master,
  37.                                   initfile = self.__initfile,
  38.                                   ignore = self.__ignore)
  39.         else:
  40.             self.__pw.deiconify()
  41.         # convert color
  42.         if colordb:
  43.             self.__sb.set_colordb(colordb)
  44.         else:
  45.             colordb = self.__sb.colordb()
  46.         if color:
  47.             r, g, b = Main.initial_color(color, colordb)
  48.             self.__sb.update_views(r, g, b)
  49.         # reset the canceled flag and run it
  50.         self.__sb.canceled(0)
  51.         Main.run(self.__pw, self.__sb)
  52.         rgbtuple = self.__sb.current_rgb()
  53.         self.__pw.withdraw()
  54.         # check to see if the cancel button was pushed
  55.         if self.__sb.canceled_p():
  56.             return None, None
  57.         # try to return the color name from the database if there is an exact
  58.         # match, otherwise use the "#rrggbb" spec.  TBD: Forget about color
  59.         # aliases for now, maybe later we should return these too.
  60.         name = None
  61.         if not self.__wantspec:
  62.             try:
  63.                 name = colordb.find_byrgb(rgbtuple)[0]
  64.             except ColorDB.BadColor:
  65.                 pass
  66.         if name is None:
  67.             name = ColorDB.triplet_to_rrggbb(rgbtuple)
  68.         return rgbtuple, name
  69.  
  70.     def save(self):
  71.         if self.__sb:
  72.             self.__sb.save_views()
  73.  
  74.  
  75. # convenience stuff
  76. _chooser = None
  77.  
  78. def askcolor(color = None, **options):
  79.     """Ask for a color"""
  80.     global _chooser
  81.     if not _chooser:
  82.         _chooser = apply(Chooser, (), options)
  83.     return _chooser.show(color, options)
  84.  
  85. def save():
  86.     global _chooser
  87.     if _chooser:
  88.         _chooser.save()
  89.  
  90.  
  91. # test stuff
  92. if __name__ == '__main__':
  93.     class Tester:
  94.         def __init__(self):
  95.             from Tkinter import *
  96.             self.__root = tk = Tk()
  97.             b = Button(tk, text='Choose Color...', command=self.__choose)
  98.             b.pack()
  99.             self.__l = Label(tk)
  100.             self.__l.pack()
  101.             q = Button(tk, text='Quit', command=self.__quit)
  102.             q.pack()
  103.  
  104.         def __choose(self, event=None):
  105.             rgb, name = askcolor(master=self.__root)
  106.             if rgb is None:
  107.                 text = 'You hit CANCEL!'
  108.             else:
  109.                 r, g, b = rgb
  110.                 text = 'You picked %s (%3d/%3d/%3d)' % (name, r, g, b)
  111.             self.__l.configure(text=text)
  112.  
  113.         def __quit(self, event=None):
  114.             self.__root.quit()
  115.  
  116.         def run(self):
  117.             self.__root.mainloop()
  118.     t = Tester()
  119.     t.run()
  120.     # simpler
  121. ##    print 'color:', askcolor()
  122. ##    print 'color:', askcolor()
  123.